import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;

// 扫描指定目录，并找到名称或者内容中包含指定字符的所有普通文件（不包含目录）
public class Test3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入要搜索的根目录:");
        String rootPath = scanner.next();
        System.out.println("请输入要搜索的关键字:");
        String word = scanner.next();

        // 验证用户输入是否合法
        if(word.isEmpty()){
            System.out.println("输入的关键字为空!");
            return;
        }
        File rootFile = new File(rootPath);
        if(!rootFile.isDirectory()){
            // 路径不存在或者路径对应的是普通文件.
            System.out.println("输入的根目录有误!");
            return;
        }
        // 进行递归搜索
        search(rootFile,word);
    }

    private static void search(File rootFile, String word) {
        // 1. 列出 rootFile 中所有的内容
        File[] files = rootFile.listFiles();
        if(files == null){
            return;
        }
        // 2. 遍历每个文件对象
        for(File file : files){
            if(file.isFile()){
                // 读取文件内容, 进行进一步判定
                trySearch(file,word);
            }else if(file.isDirectory()){
                // 递归调用搜索函数
                search(file,word);
            }
        }
    }

    private static void trySearch(File file, String word) {
        // 1. 先判定文件名是否包含
        if(file.getName().contains(word)){
            System.out.println("找到了匹配的文件! 文件名匹配! " + file.getAbsolutePath());
        }
        // 2. 再判定文件内容是否包含
        //    把文件完整的读出来，进行字符串查找.
        //    由于是拿着 word 字符串进行匹配, 按照字符的方式读取文件比较合适. 把字符串 二进制数据中进行匹配意义不大.
        /* 文件内容操作 => 流对象
          字节流（二进制文件）InputStream  FileInputStream
                           OutputStream FileOutputStream
          字符流（文本文件） Reader FileReader
                          Writer FileWriter   */
        try(Reader reader = new FileReader(file)){
            // 存放读取出来的文件结果
            StringBuilder result = new StringBuilder();
            while(true){
                char[] chars = new char[1024];
                int n = reader.read(chars);
                if(n == -1){
                    break;
                }
                result.append(chars,0,n);
            }
            // 判定 StringBuilder 中是否包含 word
            if(result.indexOf(word) >= 0){
                // 找到了
                System.out.println("找到了匹配的文件! 内容匹配! " + file.getAbsolutePath());
            }else {
                // 没找到
                System.out.println("没有匹配的文件内容！");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
